page.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. "use client";
  2. import {
  3. getCommissionApi,
  4. getRegisterCountApi,
  5. getTotalCountApi,
  6. getWithdrawalApi,
  7. UserAgentToDayInfo,
  8. UserCommissionStatistics,
  9. } from "@/api/summary";
  10. import { useUserInfoStore } from "@/stores/useUserInfoStore";
  11. import { useRequest } from "ahooks";
  12. import { Toast } from "antd-mobile";
  13. import { useLocale, useTranslations } from "next-intl";
  14. import { getToken } from "@/utils/Cookies";
  15. import { copyText } from "@/utils/methods";
  16. import { FC, useRef, useState } from "react";
  17. import "./page.scss";
  18. interface Props {}
  19. const App: FC<Props> = (props) => {
  20. const t = useTranslations("SummaryPage");
  21. const locale = useLocale();
  22. const sliderRef = useRef<HTMLDivElement>(null);
  23. const [num, setNum] = useState(100);
  24. const [money, setMoney] = useState("5000");
  25. const { userInfo } = useUserInfoStore();
  26. const token = getToken();
  27. // 生成分享链接
  28. const BASE_URL = process.env.NEXT_PUBLIC_SHARE_URL;
  29. const shareUrl = `${BASE_URL}/${locale}/${userInfo ? userInfo.referrer_code : "xxxxxx"}`;
  30. // 轮询时间
  31. const TIME = 180000;
  32. const [todayData, setTodayData] = useState<UserAgentToDayInfo>({
  33. commissar: 0,
  34. effective_amount: 0,
  35. recharge_user_count: 0,
  36. reg_count: 0,
  37. });
  38. const getUserMoneyHandler = () => {
  39. if (token) {
  40. return getRegisterCountApi();
  41. }
  42. return Promise.reject();
  43. };
  44. useRequest(getUserMoneyHandler, {
  45. pollingInterval: TIME,
  46. pollingWhenHidden: true,
  47. pollingErrorRetryCount: 3,
  48. staleTime: 5000,
  49. refreshDeps: [token],
  50. onError: (error) => {},
  51. onSuccess: (res) => {
  52. if (res.data) {
  53. setTodayData(res.data);
  54. }
  55. },
  56. });
  57. const [totalData, setTotalData] = useState<UserAgentToDayInfo>({
  58. commissar: 0,
  59. effective_amount: 0,
  60. recharge_user_count: 0,
  61. reg_count: 0,
  62. });
  63. const getTotalCount = () => {
  64. if (token) {
  65. return getTotalCountApi();
  66. }
  67. return Promise.reject();
  68. };
  69. useRequest(getTotalCount, {
  70. pollingInterval: TIME,
  71. pollingWhenHidden: true,
  72. pollingErrorRetryCount: 3,
  73. staleTime: 5000,
  74. refreshDeps: [token],
  75. onError: (error) => {},
  76. onSuccess: (res) => {
  77. if (res.data) {
  78. setTotalData(res.data);
  79. }
  80. },
  81. });
  82. const [commissionData, setCommissionData] = useState<UserCommissionStatistics>({
  83. commissar: 0,
  84. level: 0,
  85. withdrawal_commissions: 0,
  86. });
  87. const getCommission = () => {
  88. if (token) {
  89. return getCommissionApi();
  90. }
  91. return Promise.reject();
  92. };
  93. const { run: commissionRun } = useRequest(getCommission, {
  94. pollingInterval: TIME,
  95. pollingWhenHidden: true,
  96. pollingErrorRetryCount: 3,
  97. staleTime: 5000,
  98. refreshDeps: [token],
  99. onError: (error) => {},
  100. onSuccess: (res) => {
  101. if (res.data) {
  102. setCommissionData(res.data);
  103. }
  104. },
  105. });
  106. const handleSlide: any = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
  107. if (sliderRef.current) {
  108. const startX = sliderRef.current.getBoundingClientRect().x;
  109. const x = e.clientX - startX;
  110. const xRem = x / (144 * 0.6);
  111. const intNum = Math.round(10000 * xRem) - Math.round((10000 * xRem) % 10);
  112. setNum(intNum);
  113. const m = intNum * 50;
  114. let r = "";
  115. const arr = m.toString().split("");
  116. arr.forEach((item, i) => {
  117. if (i !== arr.length - 1 && (arr.length - i - 1) % 3 === 0) {
  118. r += item + ",";
  119. } else {
  120. r += item;
  121. }
  122. });
  123. setMoney(r);
  124. const scale = (Math.round(xRem * 10000) / 100.0).toFixed(2) + "%";
  125. sliderRef.current.style.width = scale;
  126. }
  127. };
  128. const copy = (text: string) => {
  129. copyText(text);
  130. Toast.show({ icon: "success", content: t("copySuc"), maskClickable: false });
  131. };
  132. const withdrawalHandler = async () => {
  133. await getWithdrawalApi({ amount: 10 });
  134. // 间隔时间
  135. setTimeout(() => {
  136. commissionRun();
  137. }, 100);
  138. };
  139. // @ts-ignore
  140. return (
  141. <div className="content">
  142. <div className="summary referral-router-view">
  143. <div className="content" style={{ marginTop: 0 }}>
  144. <div className="title">
  145. <div>
  146. {t("Hoje")}
  147. <span className="iconfont icon-bangzhu" />
  148. </div>
  149. </div>
  150. <div className="cardMian">
  151. <ul className="statistics-card">
  152. <li>
  153. <p className="num">{todayData.reg_count}</p>
  154. <p> {t("Inscrições")} </p>
  155. </li>
  156. <li>
  157. <p className="num">{todayData.recharge_user_count}</p>
  158. <p> {t("Novos")} </p>
  159. </li>
  160. <li>
  161. <p className="num">
  162. <span className={"mr-[5px]"}>{t("R$")}</span>
  163. {todayData.effective_amount}
  164. </p>
  165. <p> {t("Aposta")} </p>
  166. </li>
  167. <li>
  168. <p className="num">
  169. <span className={"mr-[5px]"}>{t("R$")}</span>
  170. {todayData.commissar}
  171. </p>
  172. <p> {t("Comissão")} </p>
  173. </li>
  174. </ul>
  175. </div>
  176. </div>
  177. <div className="content">
  178. <div className="title">
  179. <div>
  180. {t("Total")}
  181. <span className="iconfont icon-bangzhu" />
  182. </div>
  183. </div>
  184. <div className="cardMian">
  185. <ul className="statistics-card">
  186. <li>
  187. <p className="num">{totalData.reg_count}</p>
  188. <p> {t("Inscrições")} </p>
  189. </li>
  190. <li>
  191. <p className="num">{totalData.recharge_user_count}</p>
  192. <p> {t("Jogadores")} </p>
  193. </li>
  194. <li>
  195. <p className="num">
  196. <span className={"mr-[5px]"}>{t("R$")}</span>
  197. {totalData.effective_amount}
  198. </p>
  199. <p> {t("ApostaTotal")} </p>
  200. </li>
  201. <li>
  202. <p className="num">
  203. <span className={"mr-[5px]"}>{t("R$")}</span>
  204. {totalData.commissar}
  205. </p>
  206. <p>RS {t("Comissão")} </p>
  207. </li>
  208. </ul>
  209. </div>
  210. </div>
  211. <div className="content">
  212. <div className="title">
  213. <div>
  214. {t("Comissão")}
  215. <span className="iconfont icon-bangzhu" />
  216. </div>
  217. </div>
  218. <div className="cardMian">
  219. <div className="vip">
  220. <div className="level">
  221. <span className="iconfont icon-vip"></span>
  222. <span className="levelNum">{commissionData.level}</span>
  223. </div>
  224. <div>
  225. {t("Nível")}
  226. <span className="iconfont icon-tishi"></span>
  227. </div>
  228. </div>
  229. <div>
  230. <ul className="commission">
  231. <li>
  232. <p className="num">
  233. <span>{t("R$")}</span>
  234. <span className="cash">
  235. {commissionData.withdrawal_commissions}
  236. </span>
  237. </p>
  238. <p> {t("TotalPago")} </p>
  239. </li>
  240. <li>
  241. <p className="num">
  242. <span>{t("R$")}</span>
  243. <span className="cash">{commissionData.commissar}</span>
  244. </p>
  245. <p> {t("Não")} </p>
  246. </li>
  247. </ul>
  248. <div className="wallet">
  249. <div className="btn" onClick={withdrawalHandler}>
  250. {t("TRANSFERIR")}{" "}
  251. </div>
  252. <div className="tip">
  253. <span className="iconfont icon-tishi1"></span>
  254. {t("Valor")}
  255. </div>
  256. </div>
  257. </div>
  258. </div>
  259. </div>
  260. <div className="content shareMain">
  261. <div className="title">
  262. <div>{t("title1")}</div>
  263. </div>
  264. <div className="share">
  265. <ul className="sharePlatform">
  266. <li>
  267. <a href="">
  268. <img src="/img/facebook.webp" alt="" />
  269. </a>
  270. <span>{t("Facebook")}</span>
  271. </li>
  272. <li>
  273. <a href="">
  274. <img src="/img/WhatsApp.webp" alt="" />
  275. </a>
  276. <span>{t("WhatsApp")}</span>
  277. </li>
  278. <li>
  279. <a href="">
  280. <img src="/img/Telegram.png" alt="" />
  281. </a>
  282. <span>{t("Telegram")}</span>
  283. </li>
  284. <li>
  285. <a href="">
  286. <img src="/img/Twitter.webp" alt="" />
  287. </a>
  288. <span>{t("Twitter")}</span>
  289. </li>
  290. <li>
  291. <a href="">
  292. <img src="/img/email.webp" alt="" />
  293. </a>
  294. <span>{t("Email")}</span>
  295. </li>
  296. </ul>
  297. </div>
  298. <div className="shareLink">
  299. <div className="">{t("content1")}</div>
  300. <div className="copyUrl">
  301. <span className="url omitWrap">{shareUrl}</span>
  302. <span id="copy" onClick={() => copy(shareUrl)}>
  303. {t("Cópia")}
  304. </span>
  305. </div>
  306. </div>
  307. </div>
  308. <div className="content">
  309. <div className="title">
  310. <div> {t("title2")}</div>
  311. </div>
  312. <div>
  313. <div className="tel-box">
  314. <a href="" className="telicon">
  315. <img src="/img/telegram.webp" alt="" />
  316. </a>
  317. <div className="hintTitle3">{t("content2-1")}</div>
  318. </div>
  319. <div className="hintTitle2">
  320. <i className="iconfont icon-tishi"></i>
  321. {t("content2-2")}
  322. <a
  323. href=""
  324. style={{
  325. borderBottom: "1px solid rgb(109, 155, 195)",
  326. color: "#0000EE",
  327. }}
  328. >
  329. {t("business")}
  330. </a>
  331. </div>
  332. </div>
  333. </div>
  334. <div className="content">
  335. <div className="title">
  336. <div>
  337. {t("title3")}
  338. <span className="iconfont icon-bangzhu"></span>
  339. </div>
  340. </div>
  341. <div className="hint">
  342. <div className="hintTitle">{t("content3")}</div>
  343. <div className="imgContent">
  344. <img src="/img/cash.png" alt="" />
  345. <div>
  346. {t("number")}
  347. {num}
  348. <br />
  349. {t("Comissão")} &gt; {t("R$")} {money} {t("money")}
  350. </div>
  351. <div
  352. className="slider van-slider"
  353. style={{ height: "0.02rem" }}
  354. onClick={handleSlide}
  355. >
  356. <div
  357. className="van-slider__bar"
  358. style={{ width: "0.900901%", background: "rgb(0, 157, 128)" }}
  359. ref={sliderRef}
  360. >
  361. <div role="slider" className="van-slider__button-wrapper">
  362. <div className="img"></div>
  363. </div>
  364. </div>
  365. </div>
  366. </div>
  367. <div className="relationSchema">
  368. <div className="groupTitle">{t("title4")}</div>
  369. <img src="/img/group_br.webp" alt="" className="groupImg" />
  370. <ul className="rules">
  371. <li>
  372. {t("content4-1")}
  373. <span style={{ color: "red" }}>{t("red")}</span>.
  374. </li>
  375. <li>{t("content4-2")}</li>
  376. </ul>
  377. </div>
  378. </div>
  379. </div>
  380. <div className="content"></div>
  381. </div>
  382. </div>
  383. );
  384. };
  385. export default App;